home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / game / shoot / ADoomPPC_src.lha / ADoomPPC_src / amiga_main.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-29  |  8.0 KB  |  367 lines

  1. // Emacs style mode select   -*- C++ -*- 
  2. //-----------------------------------------------------------------------------
  3. //
  4. // $Id:$
  5. //
  6. // Copyright (C) 1993-1996 by id Software, Inc.
  7. //
  8. // This source is available for distribution and/or modification
  9. // only under the terms of the DOOM Source Code License as
  10. // published by id Software. All rights reserved.
  11. //
  12. // The source is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
  15. // for more details.
  16. //
  17. // $Log:$
  18. //
  19. // DESCRIPTION:
  20. //    Main program, simply calls D_DoomMain high level loop.
  21. //
  22. //-----------------------------------------------------------------------------
  23.  
  24. #ifdef WARPUP
  25. const char amigaversion[] = "$VER: ADoomWOS 1.5 (29.09.2000)";
  26. #else
  27. const char amigaversion[] = "$VER: ADoomPPC 1.5 (29.09.2000)";
  28. #endif
  29.  
  30. long __oslibversion = 38;    /* we require at least OS3.0 for LoadRGB32() */
  31. char __stdiowin[] = "CON:0/20/640/140/ADoomPPC/AUTO/CLOSE/WAIT";
  32.  
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35.  
  36. #include <exec/exec.h>
  37. #include <workbench/startup.h>
  38. #include <workbench/workbench.h>
  39. #include <workbench/icon.h>
  40. #ifdef WARPUP
  41. #include <powerpc/powerpc.h>
  42. #include <clib/powerpc_protos.h>
  43. #else
  44. #include <PowerUP/ppclib/ppc.h>
  45. #endif
  46.  
  47. #include <proto/exec.h>
  48. #include <proto/icon.h>
  49. #include <proto/utility.h>
  50. #include <clib/alib_protos.h>
  51.  
  52. #include "doomdef.h"
  53.  
  54. #include "m_argv.h"
  55. #include "d_main.h"
  56. #include "i_system.h"
  57. #include "m_fixed.h"
  58.  
  59. /**********************************************************************/
  60.  
  61. int VERSION = 110;
  62.  
  63. int cpu_type;
  64. int bus_clock;
  65. int bus_MHz;
  66. double tb_scale_lo;
  67. double tb_scale_hi;
  68.  
  69. /**********************************************************************/
  70. #ifdef __SASC
  71. extern int _WBArgc;
  72. extern char **_WBArgv;
  73. #endif
  74.  
  75. #ifdef MORPHOS
  76. struct UtilityBase *UtilityBase = NULL;
  77. #endif
  78.  
  79. #ifdef WARPUP
  80. struct Library *IconBase = NULL;
  81. static UBYTE **ttypes = NULL;
  82. void main_cleanup(void);
  83. #endif
  84.  
  85. #ifdef __VBCC__
  86. FILE *conout, *oldstderr, *oldstdout;
  87. #endif
  88.  
  89. int main (int argc, char* argv[])
  90.   int p;
  91.     ULONG i, i2;
  92.   double pll;
  93.  
  94. #ifdef __SASC
  95.     if (argc == 0) {
  96.         argc = _WBArgc;
  97.         argv = _WBArgv;
  98.         myargc = argc;
  99.         if ((myargv = malloc(sizeof(char *)*MAXARGVS)) == NULL)
  100.             I_Error ("malloc(%d) failed", sizeof(char *)*MAXARGVS);
  101.         memset (myargv, 0, sizeof(char *)*MAXARGVS);
  102.         memcpy (myargv, argv, sizeof(char *)*myargc);
  103.     }
  104.     else {
  105.         myargc = argc;
  106.         myargv = argv;
  107.     }
  108. #else
  109.     if (argc == 0) {
  110.         atexit(main_cleanup);
  111.  
  112. #ifdef __VBCC__
  113.         if ((conout = fopen(__stdiowin, "wb")) == NULL)
  114.             exit(1);
  115.         oldstderr = stderr;
  116.         oldstdout = stdout;
  117.         stderr = conout;
  118.         stdout = conout;
  119. #endif
  120.  
  121.         if ((myargv = malloc(sizeof(char *)*MAXARGVS)) == NULL)
  122.             I_Error ("malloc(%d) failed", sizeof(char *)*MAXARGVS);
  123.         memset (myargv, 0, sizeof(char *)*MAXARGVS);
  124.         if ((IconBase = OpenLibrary("icon.library", 0)) == NULL)
  125.             I_Error ("Can't open icon.library v0");
  126.         if ((ttypes = ArgArrayInit(argc, (UBYTE **)argv)) == NULL)
  127.             I_Error ("Can't read tooltypes");
  128.         myargc = 1;
  129.         myargv[0] = "ADoomWOS";
  130.         while(ttypes[myargc-1] != NULL) {
  131.             myargv[myargc] = ttypes[myargc-1];
  132.             myargc++;
  133.         }
  134.     }
  135.     else {
  136.         myargc = argc;
  137.         myargv = argv;
  138.     }
  139. #endif
  140.  
  141.     printf ("%s\n", &amigaversion[6]);
  142.  
  143. #ifdef WARPUP
  144.     printf ("\nADoomWOS parameters are:\n\n    ");
  145. #else
  146.   printf ("\nADoomPPC parameters are:\n\n    ");
  147. #endif
  148.  
  149.   for (i = 1 ; i < myargc; i++)
  150.     printf (" %s", myargv[i]);
  151.   printf ("\n\n");
  152.  
  153. #if defined(MORPHOS)
  154.     p = M_CheckParm ("-cpu");
  155.     if (p && p < myargc - 1) {
  156.         cpu_type = atoi (myargv[p+1]);
  157.     }
  158.   switch (cpu_type) {
  159.     case 3:
  160.       printf ("\nCPU is PPC603 ");
  161.       break;
  162.     case 4:
  163.       printf ("\nCPU is PPC604 ");
  164.       break;
  165.     case 5:
  166.       printf ("\nCPU is PPC602 ");
  167.       break;
  168.     case 6:
  169.       printf ("\nCPU is PPC603e ");
  170.       break;
  171.     case 7:
  172.       printf ("\nCPU is PPC603e+ ");
  173.       break;
  174.     case 8:
  175.       printf ("\nCPU is PPC604e ");
  176.       break;
  177.     default:
  178.       printf ("\nCPU is PPC ");
  179.       break;
  180.   }
  181.     p = M_CheckParm ("-bus");
  182.   if (p && p < myargc - 1) {
  183.     bus_clock = atoi (myargv[p+1]);
  184.   }
  185.   bus_MHz = bus_clock / 1000000;
  186.   printf("Bus clock is %d MHz.\n\n", bus_MHz);
  187.  
  188. #elif defined(WARPUP)
  189.     {
  190.     struct TagItem ti_cputype[] = {{GETINFO_CPU, 0}, {TAG_END, 0}};
  191.     struct TagItem ti_cpuclock[] = {{GETINFO_CPUCLOCK, 0}, {TAG_END, 0}};
  192.     struct TagItem ti_busclock[] = {{GETINFO_BUSCLOCK, 0}, {TAG_END, 0}};
  193.  
  194.     GetInfo (ti_cputype);
  195.     cpu_type = ti_cputype[0].ti_Data;
  196.     switch (cpu_type) {
  197.       case CPUF_603:
  198.         printf ("\nCPU is PPC603 ");
  199.         break;
  200.       case CPUF_604:
  201.         printf ("\nCPU is PPC604 ");
  202.         break;
  203.       case CPUF_603E:
  204.         printf ("\nCPU is PPC603e ");
  205.         break;
  206.       case CPUF_604E:
  207.         printf ("\nCPU is PPC604e ");
  208.         break;
  209.       case CPUF_620:
  210.         printf ("\nCPU is PPC620 ");
  211.         break;
  212.       default:
  213.         printf ("\nCPU is PPC ");
  214.         break;
  215.     }
  216.  
  217.     GetInfo (ti_cpuclock);
  218.     bus_clock = ti_cpuclock[0].ti_Data;
  219.     printf ("running at %d MHz\n", bus_clock / 1000000);
  220.  
  221.     GetInfo (ti_busclock);
  222.     bus_clock = ti_busclock[0].ti_Data;
  223.         p = M_CheckParm ("-bus");
  224.       if (p && p < myargc - 1) {
  225.             bus_clock = atoi (myargv[p+1]);
  226.       }
  227.     bus_MHz = bus_clock / 1000000;
  228.     printf("Bus clock is %d MHz.\n\n", bus_MHz);
  229.     }
  230. #else /* PowerUP */
  231.   cpu_type = PPCGetAttr(PPCINFOTAG_CPU);
  232.   p = M_CheckParm ("-cpu");
  233.   if (p && p < myargc - 1) {
  234.     cpu_type = atoi (myargv[p+1]);
  235.   }
  236.   switch (cpu_type) {
  237.     case 3:
  238.       printf ("\nCPU is PPC603 ");
  239.       break;
  240.     case 4:
  241.       printf ("\nCPU is PPC604 ");
  242.       break;
  243.     case 5:
  244.       printf ("\nCPU is PPC602 ");
  245.       break;
  246.     case 6:
  247.       printf ("\nCPU is PPC603e ");
  248.       break;
  249.     case 7:
  250.       printf ("\nCPU is PPC603e+ ");
  251.       break;
  252.     case 8:
  253.       printf ("\nCPU is PPC604e ");
  254.       break;
  255.     default:
  256.       printf ("\nCPU is PPC ");
  257.       break;
  258.   }
  259.  
  260.   bus_clock = PPCGetAttr(PPCINFOTAG_CPUCLOCK);
  261.   printf ("running at %d MHz ", bus_clock);
  262.   if (!bus_clock)
  263.     bus_clock = 50000000;
  264.   else
  265.     bus_clock = bus_clock * 1000000;
  266.   i = PPCGetAttr(PPCINFOTAG_CPUPLL);
  267.   if ((i & 0xf0000000) && !(i & 0x0ffffff0))
  268.     i2 = i >> 28;     /* work around bug in ppc.library */
  269.   else
  270.     i2 = i & 0x0000000f;
  271.   switch (i2) {    /* see http://mx1.xoom.com/silicon/docs/ppc_pll.html */
  272.     case 0:
  273.     case 1:
  274.     case 2:
  275.     case 3:
  276.       pll = 1.0;            // PLL is 1:1 (or bypassed)
  277.       break;
  278.     case 4:
  279.     case 5:
  280.       pll = 2.0;            // PLL is 2:1
  281.       break;
  282.     case 6:
  283.       pll = 2.5;
  284.       break;
  285.     case 7:
  286.       pll = 4.5;
  287.       break;
  288.     case 8:
  289.     case 9:
  290.       pll = 3.0;            // PLL is 3:1
  291.       break;
  292.     case 10:
  293.       pll = 4.0;
  294.       break;
  295.     case 11:
  296.       pll = 5.0;
  297.       break;
  298.     case 12:
  299.       if ((cpu_type == 4) || (cpu_type == 8))
  300.         pll = 1.5;            // PLL is 1.5:1
  301.       else
  302.         pll = 4.0;            // PLL is 4:1
  303.       break;
  304.     case 13:
  305.       pll = 6.0;            // PLL is 6:1
  306.       break;
  307.     case 14:
  308.       pll = 3.5;            // PLL is 3.5:1
  309.       break;
  310.     default:
  311.       pll = 3.0;
  312.       break;
  313.   }
  314.  
  315.   printf ("using a PLL divisor of %3.1f.\n", pll);
  316.  
  317.   bus_clock = (int)((double)bus_clock / pll);
  318.   p = M_CheckParm ("-bus");
  319.   if (p && p < myargc - 1) {
  320.     bus_clock = atoi (myargv[p+1]);
  321.   }
  322.   bus_MHz = bus_clock / 1000000;
  323.   printf("Bus clock is %d MHz.\n\n", bus_MHz);
  324. #endif
  325.  
  326.   tb_scale_lo = ((double)(bus_clock >> 2)) / 35.0;
  327.   tb_scale_hi = (4.294967296E9 / (double)(bus_clock >> 2)) * 35.0;
  328.  
  329. /* The original fixed point code is faster on GCC */
  330. #if !defined(__GNUC__)
  331.   SetFPMode ();  /* set FPU rounding mode to "trunc towards -infinity" */
  332. #endif
  333.  
  334.   p = M_CheckParm ("-forceversion");
  335.   if (p && p < myargc - 1)
  336.     VERSION = atoi (myargv[p+1]);
  337.  
  338.   D_DoomMain ();
  339.  
  340.   return 0;
  341. }
  342.  
  343. #ifndef __SASC
  344. void main_cleanup(void)
  345. {
  346.     if (ttypes != NULL) {
  347.         ArgArrayDone();
  348.         ttypes = NULL;
  349.     }
  350.  
  351.     if (IconBase != NULL) {
  352.         CloseLibrary(IconBase);
  353.         IconBase = NULL;
  354.     }
  355.  
  356. #ifdef __VBCC__
  357.     if (conout != NULL) {
  358.         stdout = oldstdout;
  359.         stderr = oldstderr;
  360.         fclose(conout);
  361.         conout = NULL;
  362.     }
  363. #endif
  364. }
  365. #endif
  366.